package com.cy;

import com.cy.sys.service.relam.ShiroRealm;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DbpmsApplication {
    public static void main(String[] args) {
        SpringApplication.run(DbpmsApplication.class,args);
    }

    /**
     * 将realm存入spring中，因此shiroRealm可以调用@Autowired
     * 定义Realm对象，通过此对象访问数据库中的用户
     * @Bean注解描述方法时，表示方法的返回要交给spring管理，这个bean的名字默认为方法名，还可以自己起名，例如@Bean("Shiro1")
     * @return
     */
    @Bean
    public Realm realm(){
        return new ShiroRealm();
    }

    /**
     * 基于此对象定义过滤规则，例如哪些请求必须要认真，哪些请求需要认证
     * ShiroFilterChainDefinition 此对象中定义了若干个过滤器（Filter），基于这些过滤器
     * 以及我们定义的过滤规则对业务进行实现
     * 多态应该用方法的方法的返回值类型和列表类型
     * @return
     */
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
//        定义过滤链对象
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
//        //      anon对应的时（匿名处理）  并且有顺序要求 若是放在验证下面，就要先验证才能访问
//        chainDefinition.addPathDefinition("/menu/**", "anon");

////        设置哪些资源的认证规则才可以访问 authc对应过滤链中的过滤器处理（验证处理） /user/**（url）
////        这里表示对这个url，要调用过滤链中的哪个过滤器进行处理
//        chainDefinition.addPathDefinition("/user/**", "authc");

        //配置/user/login/**开头的资源，可以匿名访问(不用登录就可以访问),
//其中 anon 为 shiro 框架指定的匿名过滤器
        chainDefinition.addPathDefinition("/user/login/**","anon");
//配置登出操作 logout为登出处理 登出跳转到登录页面
        chainDefinition.addPathDefinition("/user/logout","logout");
//配置以/**开头的资源必须都要经过认证，
//其中 authc 为 shiro 框架指定的认证过滤器
        chainDefinition.addPathDefinition("/**", "authc");
//当我们访问一个需要认证以后才可以访问的资源时，但是你还没有认证，此时会跳转到登录页面
        return chainDefinition;
    }
}
